package br.com.equipe1.controler;

import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;

import br.com.equipe1.model.Empresa;
import br.com.equipe1.model.service.CargoService;
import br.com.equipe1.model.service.EmpresaService;
import br.com.equipe1.model.service.EnderecoEmpresaService;
import br.com.equipe1.model.service.EnderecoRepresentanteService;
import br.com.equipe1.model.service.RamoAtuacaoService;
import br.com.equipe1.model.service.RepresentanteService;
import br.com.equipe1.utils.FacesUtils;

@ManagedBean
@ViewScoped
public class EmpresaBean implements Serializable{
	
	private static final long serialVersionUID = -5891954676588522517L;
	
	private Empresa empresa;
	private RamoAtuacaoService ramoAtuacaoService;
	private EnderecoEmpresaService enderecoEmpresaService;
	private RepresentanteService representanteService;
	private CargoService cargoService;
	private EnderecoRepresentanteService enderecoRepresentanteService;
	private EmpresaService empresaService;
	private List<Empresa> listaEmpresas;
	private boolean isEditando;
	private Map<String, Object> filtro;
	
	public String getHeader(){
		if(isEditando){
			return "Editar Empresa";
		}
		return "Cadastrar Empresa";
		
	}
	
	public void editar(){
		setEditando(true);
		getEmpresa();
	}
		
	public void salvar(){
		try {
			ramoAtuacaoService = new RamoAtuacaoService();
			ramoAtuacaoService.salvar(getEmpresa().getRamoAtuacao());
			enderecoEmpresaService = new EnderecoEmpresaService();
			enderecoEmpresaService.salvar(getEmpresa().getEnderecoEmpresa());
			if(getEmpresa().getRepresentante().getNome() == null){
				getEmpresa().setRepresentante(null);
			} else {
				cargoService = new CargoService();
				cargoService.salvar(getEmpresa().getRepresentante().getCargo());
				enderecoRepresentanteService = new EnderecoRepresentanteService();
				enderecoRepresentanteService.salvar(getEmpresa().getRepresentante().getEnderecoRepresentante());
				representanteService = new RepresentanteService();
				representanteService.salvar(getEmpresa().getRepresentante());				
			}
			empresaService = new EmpresaService();
			empresaService.salvar(getEmpresa());
			setEditando(false);
			limpar(null);
		} catch (Exception e) {
			FacesUtils.error("Erro ao salvar empresa. Contate administrador");
		}		
	}
	
	public void remover(){
		try {
			empresaService = new EmpresaService();
			empresaService.remover(getEmpresa().getId());
			getListaEmpresas().remove(getEmpresa());
		} catch (Exception e) {
			FacesUtils.error("Erro ao remover empresa. Contate administrador");
		}
	}
	
	public void consultar(){
		try {
			empresaService = new EmpresaService();
			listaEmpresas = empresaService.buscarPorFiltro(getFiltro());
			if(listaEmpresas.isEmpty()){
				FacesUtils.warn("Nenhuma empresa encontrada.");
			}
		} catch (Exception e) {
			e.printStackTrace();
			FacesUtils.error("Erro ao consultar empresa. Contate Administrador.");
		}
	}
	
	public void limpar(ActionEvent event){
		empresa = new Empresa();
		listaEmpresas = null;
	}
	
	public List<Empresa> getListaEmpresas(){
		if(listaEmpresas == null){
			empresaService = new EmpresaService();
			listaEmpresas = empresaService.buscarTodos();			
		}		
		return listaEmpresas;
	}

	public void setListaEmpresas(List<Empresa> listaEmpresas) {
		this.listaEmpresas = listaEmpresas;
	}

	public Empresa getEmpresa() {
		if(empresa == null){
			empresa = new Empresa();
		}
		return empresa;
	}

	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}

	public boolean isEditando() {
		return isEditando;
	}

	public void setEditando(boolean isEditando) {
		this.isEditando = isEditando;
	}

	public Map<String, Object> getFiltro() {
		if(filtro == null){
			filtro = new HashMap<>();
		}
		return filtro;
	}

	public void setFiltro(Map<String, Object> filtro) {
		this.filtro = filtro;
	}
}
